using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;

namespace HotUpdate.Editor
{
    public partial class ABTools
    {
        /// <summary>
        /// 上传AB包文件到服务器.
        /// </summary>
        // [MenuItem("AB包工具/上传AB包和对比文件")]
        private void UploadAllABFile()
        {
            string fullPath = Path.Combine(Application.dataPath, loaclPath, targetPlatform);
            //获取文件夹信息
            DirectoryInfo directory = Directory.CreateDirectory(fullPath);
            //获取该目录下的所有文件信息
            FileInfo[] fileInfos = directory.GetFiles();

            foreach (FileInfo info in fileInfos)
            {
                //没有后缀的 才是AB包 我们只想要AB包的信息
                //还有需要获取 资源对比文件 格式是txt（该文件夹中 只有对比文件的格式才是txt 所以可以这样判断）
                if ( /*string.IsNullOrEmpty(info.Extension)*/ info.Extension == "" ||
                                                              info.Extension == ".txt")
                {
                    //上传该文件
                    FtpUploadFile(info.FullName, info.Name);
                }
            }
        }

        /// <summary>
        /// 异步上传文件.
        /// </summary>
        private async void FtpUploadFile(string filePath, string fileName)
        {
            await Task.Run(() =>
            {
                try
                {
                    // 1.创建一个FTP连接 用于上传
                    // 资源服务器默认IP地址和远程指定目录
                    string serverUri = $"{fileServerIP}/{romatePath}/{targetPlatform}/{fileName}";
                    FtpWebRequest req = FtpWebRequest.Create(new Uri(serverUri)) as FtpWebRequest;

                    // 2.设置一个通信凭证 这样才能上传.
                    NetworkCredential n = new NetworkCredential(user, password);
                    req.Credentials = n;

                    // 3.其它设置.
                    // 设置代理为null
                    req.Proxy = null;
                    // 请求完毕后 是否关闭控制连接.
                    req.KeepAlive = false;
                    // 操作命令-上传.
                    req.Method = WebRequestMethods.Ftp.UploadFile;
                    // 指定传输的类型 2进制.
                    req.UseBinary = true;
                    // 4.上传文件.
                    // ftp的流对象.
                    Stream upLoadStream = req.GetRequestStream();
                    // 读取文件信息 写入该流对象
                    using (FileStream file = File.OpenRead(filePath))
                    {
                        //   上传内容.
                        byte[] bytes = new byte[2048];
                        // 返回值 代表读取了多少个字节.
                        int contentLength = file.Read(bytes, 0, bytes.Length);

                        // 循环上传文件中的数据.
                        while (contentLength != 0)
                        {
                            // 写入到上传流中.
                            upLoadStream.Write(bytes, 0, contentLength);
                            // 写完再读.
                            contentLength = file.Read(bytes, 0, bytes.Length);
                        }

                        // 循环完毕后 证明上传结束.
                        // file.Close();
                    }

                    // 关闭ftp的流对象.
                    upLoadStream.Close();

                    Debug.Log(fileName + "上传成功");
                }
                catch (Exception ex)
                {
                    Debug.Log(fileName + "上传失败" + ex.Message);
                }
            });
        }
    }
}